# ######################################################################################################################
# 0、硬件平台信息与编译器信息
# ######################################################################################################################

add_compile_options(-std=c11)  # 直接在编译选项中指定C11标准

# 包含Cortex-M3配置
include("${CMAKE_CURRENT_LIST_DIR}/cmake/cortex_m3.cmake")

# ######################################################################################################################
# 1、工程信息
# ######################################################################################################################

# 设置CMAKE最低版本
cmake_minimum_required(VERSION 3.20)

# 设置当前的工程名称
project(
    demo_eide_gcc
    VERSION 0.0.1
    LANGUAGES C CXX ASM)
message(STATUS "**** Building project: ${CMAKE_PROJECT_NAME}, Version: ${CMAKE_PROJECT_VERSION} ****")

# 指定链接文件
set(LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/stm32f1x_64KB_flash.ld)

# 指定启动文件
set(STARTUP_ASM ${CMAKE_SOURCE_DIR}/User/src/startup_stm32f10x_md.s)

# ######################################################################################################################
# 2、编译控制
# ######################################################################################################################

# 是否开启更详细的编译过程信息显示
set(CMAKE_VERBOSE_MAKEFILE OFF)

# ######################################################################################################################
# 3、预定义宏
# ######################################################################################################################

# 平台相关宏定义
add_definitions(
    -DUSE_STDPERIPH_DRIVER
    -DSTM32F10X_MD
)

# ######################################################################################################################
# 4、差异化构建配置
# ######################################################################################################################

option(OPEN_LOG_DEBUG "Open log output for debug" OFF)

# 修改该变量的值，可以修改输出文件的名称
set(OUTPUT_EXE_NAME ${PROJECT_NAME})

# 优化级别的差异配置
if("${CMAKE_BUILD_TYPE}" STREQUAL "Release")
    add_definitions()
elseif("${CMAKE_BUILD_TYPE}" STREQUAL "RelWithDebInfo")
    add_definitions()
elseif("${CMAKE_BUILD_TYPE}" STREQUAL "MinSizeRel")
    add_definitions()
else()
    if(OPEN_LOG_DEBUG)
        add_definitions(-DLOG_DEBUG)
    endif()
endif()

message(STATUS "**** Build for ${CMAKE_BUILD_TYPE} ****")

# ######################################################################################################################
# 5、设置文件输出路径
# ######################################################################################################################

# 设置库输出路径
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib_obj)

set(ELF_FILE ${PROJECT_BINARY_DIR}/${OUTPUT_EXE_NAME}.elf)
set(HEX_FILE ${PROJECT_BINARY_DIR}/${OUTPUT_EXE_NAME}.hex)
set(BIN_FILE ${PROJECT_BINARY_DIR}/${OUTPUT_EXE_NAME}.bin)

# ######################################################################################################################
# 6、组织公共库源文件
# ######################################################################################################################

# 添加STM32标准外设库子目录
add_subdirectory(hal)

# 添加RTT子目录
add_subdirectory(RTT)

# ######################################################################################################################
# 7、组织用户源文件
# ######################################################################################################################


# 主程序保持不变
set(USER_SOURCE
    User/src/main.c
    User/src/usart.c
    User/src/w25qxx.c
    User/src/stm32f10x_it.c
    User/src/oled.c
)

# ######################################################################################################################
# 8、编译、连接，生成可执行文件
# ######################################################################################################################

# 定义连接器参数
set(CMAKE_EXE_LINKER_FLAGS
    "${CMAKE_EXE_LINKER_FLAGS} -T ${LINKER_SCRIPT} -Wl,-Map=${PROJECT_BINARY_DIR}/${OUTPUT_EXE_NAME}.map -Wl,--gc-sections,--print-memory-usage"
)

# 设置可执行文件后缀为.elf
set(CMAKE_EXECUTABLE_SUFFIX ".elf")

# 生成可执行文件
add_executable(${PROJECT_NAME} ${USER_SOURCE} ${STARTUP_ASM})
target_link_libraries(${PROJECT_NAME} 
    STM32_StdPeriph
    RTT
)

# Include directories
target_include_directories(${PROJECT_NAME} PUBLIC
    # ${CMAKE_SOURCE_DIR}/hal/lib/cmsis
    # ${CMAKE_SOURCE_DIR}/hal/STM32F10x_StdPeriph_Driver
    # ${CMAKE_SOURCE_DIR}/hal/STM32F10x_StdPeriph_Driver/src
    # ${CMAKE_SOURCE_DIR}/hal/STM32F10x_StdPeriph_Driver/inc
    ${CMAKE_SOURCE_DIR}/User/inc
)

# ######################################################################################################################
# 9、生成 hex 和 bin 文件
# ######################################################################################################################

add_custom_command(
    TARGET "${PROJECT_NAME}"
    POST_BUILD
    COMMAND ${OBJCOPY} -Obinary "${PROJECT_NAME}.elf" "${OUTPUT_EXE_NAME}.bin"
    COMMAND ${OBJCOPY} -Oihex "${PROJECT_NAME}.elf" "${OUTPUT_EXE_NAME}.hex"
    COMMENT "Building ${OUTPUT_EXE_NAME}.bin and ${OUTPUT_EXE_NAME}.hex"
    COMMAND ${SIZE} --format=berkeley "${PROJECT_NAME}.elf"
    COMMENT "Invoking: Cross ARM GNU Print Size"
)
